package com.yy.yunpan.share.repository;

import com.yy.yunpan.share.entity.Share;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 分享数据访问层
 *
 * @author YY
 * @since 2025-10-01
 */
@Repository
public interface ShareRepository extends JpaRepository<Share, Long> {

    /**
     * 根据分享码查找分享
     *
     * @param shareCode 分享码
     * @return 分享信息
     */
    Optional<Share> findByShareCode(String shareCode);

    /**
     * 根据用户ID和文件ID查找分享
     *
     * @param userId 用户ID
     * @param fileId 文件ID
     * @return 分享列表
     */
    List<Share> findByUserIdAndFileId(Long userId, Long fileId);

    /**
     * 根据用户ID分页查询分享列表
     *
     * @param userId   用户ID
     * @param status   状态
     * @param pageable 分页参数
     * @return 分享列表
     */
    Page<Share> findByUserIdAndStatus(Long userId, Integer status, Pageable pageable);

    /**
     * 根据用户ID查询分享列表
     *
     * @param userId   用户ID
     * @param pageable 分页参数
     * @return 分享列表
     */
    Page<Share> findByUserId(Long userId, Pageable pageable);

    /**
     * 检查分享码是否已存在
     *
     * @param shareCode 分享码
     * @return 是否存在
     */
    boolean existsByShareCode(String shareCode);

    /**
     * 更新访问次数
     *
     * @param shareCode 分享码
     */
    @Modifying
    @Query("UPDATE Share s SET s.visitCount = s.visitCount + 1, s.updateTime = :updateTime WHERE s.shareCode = :shareCode")
    void incrementVisitCount(@Param("shareCode") String shareCode, @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新下载次数
     *
     * @param shareCode 分享码
     */
    @Modifying
    @Query("UPDATE Share s SET s.downloadCount = s.downloadCount + 1, s.updateTime = :updateTime WHERE s.shareCode = :shareCode")
    void incrementDownloadCount(@Param("shareCode") String shareCode, @Param("updateTime") LocalDateTime updateTime);

    /**
     * 根据文件ID查找相关分享
     *
     * @param fileId 文件ID
     * @return 分享列表
     */
    List<Share> findByFileId(Long fileId);

    /**
     * 查找已过期的分享
     *
     * @param now 当前时间
     * @return 过期的分享列表
     */
    @Query("SELECT s FROM Share s WHERE s.expireTime IS NOT NULL AND s.expireTime < :now AND s.status = 1")
    List<Share> findExpiredShares(@Param("now") LocalDateTime now);

    /**
     * 批量更新过期分享状态
     *
     * @param now 当前时间
     */
    @Modifying
    @Query("UPDATE Share s SET s.status = 0, s.updateTime = :updateTime WHERE s.expireTime IS NOT NULL AND s.expireTime < :now AND s.status = 1")
    void updateExpiredSharesStatus(@Param("now") LocalDateTime now, @Param("updateTime") LocalDateTime updateTime);
}